package com.kt.common.clazz.entrust

import com.kt.common.clazz.entrust.impl.BaseImpl

fun main() {

    /*val b = BaseImpl(830)
    Derived(b).println()*/
    /*val b = Base1Impl(10)
    Derived1(b).printMessage()
    Derived1(b).printMessageLine()*/

    val b = BaseImpl2(10)
    val derived = Derived2(b)
    derived.print()
    println(derived.message)
}

//Derived 的超类型列表中的 by-子句表示 b 将会在 Derived 中内部存储，
// 并且编译器将生成转发给 b 的所有 Base 的方法。
class Derived(b: Base) : Base by b


interface Base1 {
    fun printMessage()
    fun printMessageLine()
}

class Base1Impl(val x: Int) : Base1 {
    override fun printMessage() {
        println("Base1Impl.printMessage$x")
    }

    override fun printMessageLine() {
        println("Base1Impl.printMessageLine$x")
    }

}

class Derived1(b: Base1) : Base1 by b {

    override fun printMessage() {
        println("abc")
    }

}


interface Base2 {
    val message: String
    fun print()
}

class BaseImpl2(val x: Int) : Base2 {
    override val message = "BaseImpl: x = $x"
    override fun print() {
        //这边使用的message就是此处的成员变量
        println(message)
    }
}

class Derived2(b: Base2) : Base2 by b {
    // 在 b 的 `print` 实现中不会访问到这个属性
    override val message = "Message of Derived"
}

